package com.jqyd.mod.orm;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

public interface ORMS {
	/**
	 * 回调函数，通用get隐藏结果集并替代结果集完成数据封装
	 */
	public static interface ICallBack<D>{
		public D get(RsAccessor rs) throws SQLException;
	}
	/**
	 * 自定义查询语句
	 * @param sql 原生sql
	 * @param objs 参数数组
	 * @return
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	<D> List<D> queryRaw(String sql, Object[] args, ICallBack<D> back) throws SQLException, InstantiationException, IllegalAccessException;
	/**
	 * @param sql 原生sql
	 * @param startIndex 分页起始行
	 * @param endIndex 分页大小
	 * @param args 参数集合
	 * @param iCallBack 返回值封装
	 * @return
	 * @throws SQLException
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	<D> List<D> queryRaw(String sql, long startIndex, long endIndex, Object[] args, ICallBack<D> iCallBack) throws SQLException, InstantiationException, IllegalAccessException;
	/**
	 * @param sql
	 * @param args
	 * @param back
	 * @return
	 * @throws SQLException
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	<D> D queryRawFirst(String sql, Object[] args, ICallBack<D> back) throws SQLException, InstantiationException, IllegalAccessException;
	/**
	 * 自定义修改语句
	 * @param sql 原生sql
	 * @param objs 参数数组(此参数需对于数据库参数。如：datetime,在java中用的long型，但在做数据库交互式，传入参数请用Date对象）
	 * @return int 返回响应条数
	 * @throws SQLException
	 */
	int modifyRaw(String sql, Object...args) throws SQLException;
	/**
	 * 自定义删除语句
	 * @param sql 原生sql
	 * @param objs 参数数组
	 * @return int 返回响应条数
	 * @throws SQLException
	 */
	int deleteRaw(String sql, Object...args) throws SQLException;
	/**
	 * 
	 * @return
	 * @throws SQLException
	 */
	PreparedStatement getPrepareStatement(String sql) throws SQLException;
}
